Node.js, Deno, Bunの比較 - どれを使うべきか?
はじめに
DenoやBunなどの登場により、どのランタイムを使うべきなのかに関する意見や疑問などを見かける機会が増えてきたような気がしました このページでは、各ランタイムへの個人的な印象や意見などについてまとめてみます
私の考えとして、以下のような立場で意見をまとめています
サーバーサイドランタイムとしてのNode.jsには概ね満足していて、大きな不満は特にない スクリプティングランタイムとしてのDenoはかなり気に入っている TL;DR
最初に結論だけ書いてしまうと、現時点(2024年)では、業務におけるフロントエンド・バックエンド開発においては、DenoやBunの採用は個人的にはまだ早いと思います (将来的にはDenoとBunのどちらもNode.jsとの互換性がより改善され、いずれにしても移行も楽になると思われるので、現状ではNode.jsを使って様子見しておくのが安全ではないかと思っています) もし現時点でDenoやBunを業務におけるフロントエンド・バックエンド開発に採用したいという場合は、まずはリスクの低い箇所(スクリプティング、社内システム/ツール、Faasにおける特定のFunctionなど)に対して局所的に採用して評価や検討をした上で、段階的に採用を進めていくのが個人的には良いと思います それぞれのよい点について
(2024年時点) 誕生から15年近く経過しており、この中では最も高い安定性が期待できる
(2024年時点) 基本的にフロントエンドのエコシステムの多くはNode.jsを想定して開発されているため、最新のツールなども安定して動かしやすい DenoやBunで導入された独自の機能について少しずつ導入または検討が進められています ただ現状では多くの場合、deno run -Aで実行されるケースが比較的多いのではないかとも思うので、パーミッションシステムの存在が他のランタイムと比較したときに、どれほどメリットになるのかは正直わからないです
パッケージレベルでパーミッションを制御したいという要望はいくつか上がっていて、これがサポートされると実用度が上がる可能性はあるかもしれないと思いました () 元々、DenoはWeb標準への準拠を重視していたこともあり、この分野ではDenoが一番優位だと思う (2024年時点) (2024年時点) 最初からNode.jsとの互換性を念頭において設計・開発されている分、この点ではBunの方が有利だと思う 自分はスクリプティングでの体験の良さを気に入ってDenoを使い始めたので、これが個人的には一番よい点だと思う ただし、Denoとは異なり、型チェックについては別途、tscを使う必要あり (2024年時点) フロントエンド開発で使用するなら個人的にはDenoよりもBunの方が有利だと思う (おそらく意図的なものなのだとは思いますが) Bunは標準などから大きく外れた独自機能を導入することが多々あり、人によって好き嫌いが分かれやすい部分だとは思いますが、気にいる人にはかなり刺さる特徴なのではないかと思います 例)
所感
個人的な好み
スクリプティングやCLIツールの開発における使い勝手や体験の良さ、Web標準への準拠など、私はDenoはとても気に入っています 特にスクリプティングにおいての体験が素晴らしく、定型的な作業の効率化などではとても便利だと思っています
どれを採用するのが良いか?
先程、自分はDenoをとても気に入っているとは書きましたが、現時点(2024年)では、業務でのWeb開発においては、まだNode.jsを使うべきだと個人的には思っています また、Node.jsも進化が止まっているわけではなく、継続的にそういった欠点などの改善も試みられています Node.jsは現状では最も安定性が高く、開発においてつまずく可能性も低い 私個人の印象として、Node.jsはエコシステムがやや乱立しがち※であり、労力などが分散してしまう分、個々のORMやフルスタックフレームワークなどのバックエンド開発において必要となるライブラリの成熟度では、RailsやJava, C#あたりと比較するとどうしてもやや低くなりがちな印象があります。ただでさえそのあたりでのリスクがある上でWeb開発においてDenoやBunなどを採用するのは、現状では正直かなりリスキーであると個人的には思います ※乱立しがちであるというのは選択肢が多いというメリットとも考えられるため、一概に悪いことであるとは言えないとも思います
例えば、以下の記事などでも言及されているように、プロダクトのコアに十分に検証していない技術を採用することには大きなリスクがあり、また当初期待していた程のメリットを得られない可能性もある (新しい技術を採用した結果、却ってそれが負債となってしまう可能性がある)
DenoやBunが強みとして打ち出している様々な要素は実際に魅力的であるとは思うものの、もし採用を検討する際は、まず事前にきちんと検証や調査などをしてから採用を判断すると安全だと思います 現時点でDenoやBunをWeb開発で本格的に使おうとする場合、「〜のnpmパッケージが動かない」「Node.jsと異なる振る舞いをする」「〜を実現するライブラリがまだない」「アップデートしたら〜のnpmパッケージが動かなくなった」などといったリスクがまだまだ発生すると思います。どちらもBetter Node.jsとして使うには、まだ安定性は足りていないと個人的には思っています DenoやBunにはNode.jsにはないメリットが多くあることは事実だとは思うものの、業務におけるバックエンドやフロントエンドの開発においてはまだ時期尚早だと思う (2024年時点) 例えば、大規模なB2Bサービスの開発で採用することなどを考えた際に、DenoやBunが提供するメリットは、Node.jsが提供する安定性やシェア、情報量が豊富であることなどのメリットを現状では上回らない、というのが個人的な考えです (現状では正直、苦労することの方が多いと思います) また、Deno Deployが提供するDeno KVは、キャッシュやPub/Sub、メッセージングなどの選択肢の一つとしては悪くはないとは思うものの、大規模なサービスにおける永続化層として全面的に採用するには正直やや心許ないというのが個人的な印象です。(特に数百〜数千以上ものテーブルが必要となるような大規模なB2Bサービスの開発などにおいては、例えば関係データベースが提供するリレーションやトランザクション、行レベルセキュリティなどの仕組みは非常に有用だと思っています) このあたりは各種NewSQLであったりTursoなどの技術が発達していくと改善されていく可能性はあるのかもしれないですが、正直どうなるのかはちょっとまだわからないです 永続化レイヤーはコンピューティングレイヤーと比較して、リファクタリングなどに膨大なコストがかかってしまうケースが多いと思うので、意思決定は慎重に行うと安全ではないかと思っています 現時点では、もし採用する場合は、Deno KVに適していると思われる小規模なアプリでの採用や部分的な採用がよいのではないかと思っています Node.jsも別にレガシーなプロダクトというわけではなく、現在でも積極的に新しいものが開発されています 新しい技術を採用したからといって、必ずしも既存の課題や問題が魔法のように解決するとは限らないです。Hype Driven Developmentに陥ってしまわないように注意するとよいでしょう。実際に採用するかどうかは、評判などだけで判断するのではなく、きちんと検証や調査を実施してから判断するのがよいと思います。 参考までにDenoの使用事例をまとめているため、よろしければこちらなども参照ください🙇♂️ また、Denoには開発初期のセットアップ作業がかなり楽になるというメリットはあるものの、実際のWeb開発においてはそう何度も初期セットアップを行うようなことはまれなはずなので、そこまで恩恵はないと思われます (ただし、スクリプティングなどにおいてはこのメリットの恩恵は受けやすいはず) こういった機能はWeb開発ではなく、どちらかといえばスクリプティングなどの方が恩恵を受けやすいと思います
ESLintにおける数々の有用なプラグインによって提供される価値は、deno lintが提供するパフォーマンス上の優位性よりも上回ると個人的に考えています また、数年後にはDenoとBunはどちらももNode.jsとの互換性がさらに改善されているはずなので、もしNode.jsからそれらへ移行をしたいというようなケースが出てきたとしても、将来的にはハードルは下がっている可能性が高いと思います ただし、スクリプティングやCLIツール、Vimプラグインなどの開発ではDenoやBunはかなり使い勝手が良く、この分野での採用は現状でも十分にアリだと思います なので、もしDenoやBunの採用を考える場合は、このあたりから少しずつ進めていくのがよいと思っています Denoには他にもパーミッションシステムなどの機能はあるものの、この機能はNode.jsにおいても実装が進みつつあるため、差別化要素としてはやや弱めと見ています 具体的には、永続化に関する要件が厳しくなく、Deno KVでも十分にワークするようなケースなど (小規模なプロダクトや社内プロダクト、Webサイトなど) ただ、もし採用するとしても、当面はCIでNode.jsとBunの両方で同じテストなどを実行しておき、何か問題があった際にすぐにNode.jsへロールバックできるようにしておくと安全ではないかと思います これは用途や好みなどによって異なってくるのではないかと思っています
スクリプティングにおいては、ややDenoが有利ではないかと思っています CLIツールを作成したい場合は、双方にメリットがあり、どちらにもそこまで差はないと思います
Denoはhttps:やnpm:などによるライブラリのimportや動的なダウンロードなどの機能があります。この仕組みにはプラグインシステムを備えたアプリケーションを開発したい場合、外部ライブラリに依存したプラグインを開発・配布しやすいというメリットがあると考えられます。こういったプラグインシステムを提供するCLIアプリなどを開発する場合、Denoはとても相性が良いのではないかと思います (実際にdenops.vimではその仕組みが活用されています) フロントエンドでSPAを開発したいケースなどではBunの方が向いているのではないかと思っています 標準への準拠について
また、WinterCGでは各ランタイムでのAPIなどを標準化するための取り組みが行われています Node.jsでは (おそらくDenoやBunの影響もあって) パーミッションシステムの実装や単一実行可能ファイルの作成などのサポートが進められつつあります こういった動きもあり、将来的にはそれぞれのランタイム間の差異は徐々に縮まっていく可能性は比較的高いのではないかと思う
現時点では、できるだけこういった標準に準拠している または しやすい選択肢を採用しておくと、今後の変化に対応しやすいのではないかと思う (Remix, Honoなど) 終わりに
私の意見としては、バックエンドやフロントエンドの開発においてNode.jsではなくDenoやBunを採用するのは現時点ではまだリスキーであると思っています (ただし、CLIやスクリプティングなどにおけるDenoやBunの部分的な採用は現時点でもありだと思っています) ただし、どのランタイムもWeb標準への対応は少しずつ改善されつつあります。また、HonoやRemixなどのWeb標準を意識したフレームワークも登場しています。 これから相互運用性が少しずつ改善されていけば、各ランタイムの移行や併用などはしやすくなってくると思っており、それまでは本格的な採用は見送る方が安全なのではないかと個人的には思っています
正直、今後、どれが最も人気になるのかはわからないですが、少なくともNode.jsの需要が完全になくなってしまうということは考えにくいのではないかと思っています DenoもBunもNode.js互換性の改善にはかなり力が入れられているので、今、急いで採用や移行などをしなくとも、数年後にはよりスムーズに移行や採用などがしやすくなるはずです 少し批判的な内容も書いてしまいましたが、DenoもBunもかなり注目は浴びており、コミュニティなども活発に見えるため、個人的にはどちらもかなり期待しています 私はDenoをスクリプティングの用途で日々使っていて、とても使い勝手がよく感じています。DenoにせよBunにせよ、現時点ではWeb開発への採用は少しリスキーではあると思うので、もし興味がある際は、まずはスクリプティングなどの小さな部分から少しずつ採用していくと良いのではないかと思っています 関連ページ